package modelo;

import java.util.ArrayList;
import java.util.Iterator;

import titiritero.Dibujable;
import utilitarios.Direccion;
import utilitarios.PuntoXY;
import vistas.VistaTanqueEnemigo;

public abstract class TanqueEnemigo extends Tanque {
    
    protected static int TIEMPO_SIN_DISPARAR = 100;

	protected EstrategiaAtaque estrategiaAtaque;
	protected Objeto enemigo;
	protected int contadorDisparar;
	protected int puntosPorDestruccion;

	public TanqueEnemigo(Escenario escenario) {
		super(escenario);
		this.estaMoviendose = true;
		this.debeDisparar = true;
		this.contadorDisparar = 0;
	}

	@Override
    public Dibujable crearDibujable() {
		VistaTanqueEnemigo vistaTanque = new VistaTanqueEnemigo();
		vistaTanque.setPosicionable(this);
		return vistaTanque;
	}

	public Objeto getEnemigo() {
		return this.enemigo;
	}

	@Override
    public void moverEnDireccion(Direccion direccion) {
		PuntoXY centroDeMasaViejo = this.figura.getCentroMasa();
		PuntoXY centroDeMasaNuevo = centroDeMasaViejo.sumarDireccion(direccion);
		
		this.figura.setCentroMasa(centroDeMasaNuevo);
		if (!escenario.permiteMovimiento(this)) {
		    this.figura.setCentroMasa(centroDeMasaViejo);
		    }
		
		else {
		    @SuppressWarnings("unchecked")
		    ArrayList<Objeto> objetos = (ArrayList<Objeto>) this.escenario.getObjetos().clone();
		    Iterator<Objeto> iterador = objetos.iterator();
    		while (iterador.hasNext()) {
    			Objeto objeto = iterador.next();
    			if ((!this.equals(objeto)) && (this.figura.estaSolapadoCon(objeto.getFigura()))) {
    				objeto.chocarConTanqueEnemigo(this);
    				this.figura.setCentroMasa(centroDeMasaViejo);
    				return;
    				}
    		}
		}
	}
	
	@Override
    protected void morir() {
		this.escenario.eliminarObjeto(this);
		this.escenario.getAlgoTank().sumarUnTanqueDestruido();
		this.escenario.getAlgoTank().sumarPuntos(this.puntosPorDestruccion);
		this.tirarArmaAlPiso();
	}
	
	private void tirarArmaAlPiso() {
	    this.arma.setPosicion(this.getPosicion().sumarPunto(new PuntoXY(TAMANIO_PIXEL, 0)));
	    if (!this.escenario.agregarObjeto(this.arma)) {
	        this.arma.setPosicion(this.getPosicion().sumarPunto(new PuntoXY(0, TAMANIO_PIXEL)));
	        if (!this.escenario.agregarObjeto(this.arma)) {
	            this.arma.setPosicion(this.getPosicion().sumarPunto(new PuntoXY(-TAMANIO_PIXEL, 0)));
	            if (!this.escenario.agregarObjeto(this.arma)) {
	                this.arma.setPosicion(this.getPosicion().sumarPunto(new PuntoXY(0, -TAMANIO_PIXEL)));
	                this.escenario.agregarObjeto(this.arma);
	                }
	            }
	        }
	}
	
	@Override
    public void vivir() {
		if(this.contadorDisparar >= TIEMPO_SIN_DISPARAR) {
			this.debeDisparar = true;
			this.contadorDisparar = 0;
		}

		this.contadorDisparar += 1;
		if (this.estaMoviendose) {
			for (double i = 1.0; i <= this.velocidadMovimiento; i ++) {
				this.estrategiaAtaque.moverSegunEstrategia(this);
			}
		}
		this.estaMoviendose = true;
		if (this.debeDisparar && !this.enemigo.debeMorir()) {
			this.disparar();
			this.debeDisparar = false;
		}
	}

	public void chocarConArma(Arma unArma) {
	}

	@Override
    public void chocarConAlgoTank(TanqueAlgo unTanque) {
		this.detener();
		unTanque.detener();
	}

	@Override
    public void chocarConTanqueEnemigo(TanqueEnemigo unTanque) {
		this.detener();
		unTanque.detener();
	}

	@Override
    public void chocarConProyectil(Proyectil unProyectil) {
		this.recibirDanio(unProyectil.getDanio());
		unProyectil.detener();
		unProyectil.morir();
	}

	@Override
    public void chocarConPared(Pared unaPared) {
		this.detener();
	}

	public void chocarConCuartel(Cuartel cuartel) {
		this.detener();		
	}
}
